package main

import "fmt"

func main() {
	var b int = 10 // 初始化
	b = 20 // 赋值f
	fmt.Println("hello go !", b)

	c := 30 // 自动推导类型, 通过初始化的值确定类型, 先声明后赋值
	fmt.Printf("c type is %T\n", c) // Printf 会把内容放在占位符

	d := 20
	e := 30
	fmt.Printf("d=%d, e=%d",d, e)



	f, g := 4, 5

	// 交换两个变量的值
	var tmp int
	tmp = f
	f = g
	g = tmp
	fmt.Printf("\n交换后的值为: f=%d, g=%d", f, g)



	h, i := 10, 16
	h, i = i, h
	fmt.Printf("\n交换后的值为: h=%d, i=%d", h, i)

	j, k := 12, 14
	tmp, _ = j, k // _ 代表匿名变量, 丢弃数据不处理, 应用场景是在配合函数返回值使用才有优势, go函数可返回多个值
	fmt.Print("\ntmp=", tmp)


	// 调用test()函数
	var o, p, q int
	o, p, q = test()
	fmt.Printf("\n调用test函数的结果o=%d, p=%d, q=%d", o, p, q)

	_, p, _ = test()
	fmt.Printf("\n调用test函数的结果p=%d", p)


	// 变量 使用 var 声明, 变量可以重新赋值
	// 常量 使用 const 声明, 常量不允许赋值, 常量是不可以改变的量
	const r int = 10
	// r = 20 // err 常量不可以被修改
	fmt.Println("\nr=", r)

	var s int = 10
	s = 20
	fmt.Println("\ns=", s)

	const t = 11.2 // const 声明后不可以使用 :t
	fmt.Printf("\ntype is %T\n", t)
	fmt.Println("\nt=", t)
}

// go函数可返回多个值
func test() (l, m, n int) {
	return 1, 2, 3
}
